package com.gitee.simons.dfs;

import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.domain.fdfs.ThumbImageConfig;
import com.github.tobato.fastdfs.exception.FdfsUnsupportStorePathException;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author jsm
 * @date 2019/1/8 10:22
 * @Description
 */
@Component
@Log4j2
public class FdfsService {

    @Autowired
    private FastFileStorageClient storageClient;

    @Autowired
    private ThumbImageConfig thumbImageConfig;


    /**
     * 批量上传文件
     * @return 批量上传成功后的文件名
     * @throws IOException io
     */
    public List<String> uploadFiles(MultipartFile[] files) throws IOException {

        if(files == null && files.length <= 0) {
            throw new FdfsUnsupportStorePathException("文件为空，无法上传");
        }
        List<String> filePathList = new ArrayList<>();
        for(MultipartFile file : files) {
            filePathList.add(this.uploadFile(file));
        }
        return filePathList;
    }

    /**
     * 上传文件
     * @param file 文件对象
     * @return 文件访问地址
     * @throws IOException io
     */
    public String uploadFile(MultipartFile file) throws IOException {
        StorePath storePath = storageClient.uploadFile(file.getInputStream(),file.getSize(), cutName(file.getOriginalFilename()),null);
        if(storePath == null) {
            throw new FdfsUnsupportStorePathException("文件上传返回为空");
        }
        return storePath.getFullPath();
    }


    /**
     * 上传文件
     * @param file 文件对象
     * @return 文件访问地址
     * @throws IOException io
     */
    public String uploadFileInLocal(File file) throws IOException {
        StorePath storePath = storageClient.uploadFile(new FileInputStream(file), file.length(), cutName(file.getName()),null);
        if(storePath == null) {
            throw new FdfsUnsupportStorePathException("文件上传返回为空");
        }
        return storePath.getFullPath();
    }

    /**
     * 删除文件
     * @param filePath 文件访问地址
     */
    public void deleteFile(String filePath) {
        if (StringUtils.isEmpty(filePath)) {
            log.error("需要删除的文件信息为空");
            return;
        }
        storageClient.deleteFile(filePath);
    }

    /**
     * 根据文件完整路径获取storePath信息
     * @param filePath 完整文件路径地址
     * @return 文件服务器上的文件信息
     */
    public StorePath getStorePath(String filePath) {
       return StorePath.parseFromUrl(filePath);
    }

    /**
     * 上传文件并生成缩略图
     * @param file 上传的文件
     * @return 上传成功的文件信息
     * @throws IOException io
     */
    public StorePath uploadPicInWeb(MultipartFile file)throws IOException {
        return storageClient.uploadImageAndCrtThumbImage(file.getInputStream(), file.getSize(), cutName(file.getOriginalFilename()), null);
    }


    /**
     * 上传本地文件并生成缩略图
     * @param file 文件
     * @return 文件服务器上的文件信息
     * @throws IOException io异常
     */
    public StorePath uploadPicInLocal(File file)throws IOException {
        return storageClient.uploadImageAndCrtThumbImage(new FileInputStream(file), file.length(), cutName(file.getName()), null);
    }

    /**
     * 根据文件信息获取缩略图地址
     * @param storePath 文件服务器上的文件信息
     * @return 文件缩略图地址
     */
    public String getThumbImageName(StorePath storePath){
        if(storePath == null) {
            throw new FdfsUnsupportStorePathException("该文件信息不存在");
        }
        return thumbImageConfig.getThumbImagePath(storePath.getPath());
    }

    /**
     * 剪切文件名
     * @param fileName 文件名
     * @return 剪切后的文件名
     */
    private static String cutName(String fileName){
        return StringUtils.substringAfterLast(fileName, ".");
    }
}
